package com.ljy.my_study.leetcode2.动态规划.等差数列划分II_子序列;

import java.util.HashMap;
import java.util.Map;

public class TestMain {

//    给你一个整数数组 nums ，返回 nums 中所有 等差子序列 的数目。
//
//    如果一个序列中 至少有三个元素 ，并且任意两个相邻元素之差相同，则称该序列为等差序列。
//
//    例如，[1, 3, 5, 7, 9]、[7, 7, 7, 7] 和 [3, -1, -5, -9] 都是等差序列。
//    再例如，[1, 1, 2, 5, 7] 不是等差序列。
//    数组中的子序列是从数组中删除一些元素（也可能不删除）得到的一个序列。
//
//    例如，[2,5,10] 是 [1,2,1,2,4,1,5,10] 的一个子序列。
//    题目数据保证答案是一个 32-bit 整数。
//
//             
//
//    示例 1：
//
//    输入：nums = [2,4,6,8,10]
//    输出：7
//    解释：所有的等差子序列为：
//            [2,4,6]
//            [4,6,8]
//            [6,8,10]
//            [2,4,6,8]
//            [4,6,8,10]
//            [2,4,6,8,10]
//            [2,6,10]
//    示例 2：
//
//    输入：nums = [7,7,7,7,7]
//    输出：16
//    解释：数组中的任意子序列都是等差子序列。
//             
//
//    提示：
//
//            1  <= nums.length <= 1000
//            -231 <= nums[i] <= 231 - 1
//
//    来源：力扣（LeetCode）
//    链接：https://leetcode-cn.com/problems/arithmetic-slices-ii-subsequence
//    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

    public static void main(String[] args) {
        System.out.println(new TestMain().numberOfArithmeticSlices(new int[]{2,4,6,8,10}));
    }

//    动态规划+哈希表
//    前后差值d=nums[i]-nums[j]
//    f[i][d]+=f[j][d]+1;
    public int numberOfArithmeticSlices(int[] nums) {
        int result=0;
        int len=nums.length;
        Map<Long,Integer>[] maps=new HashMap[len];
        for(int i=0;i<len;i++){
            maps[i]=new HashMap<>();
        }
        for(int i=0;i<len;i++){
            for(int j=0;j<i;j++){
                long d=(long)nums[i]-nums[j];
                int count=maps[j].getOrDefault(d,0);
                result+=count;
                maps[i].put(d,maps[i].getOrDefault(d,0)+count+1);
            }
        }
        return result;
    }
}
